// 模拟实现express的中间件原理
function express() {
    const tasks = [] // 中间件的注册数组
    
    const ex = function(req, res) {

        let i = 0 // 中间件下标
 
        /**
         * 中间件的执行函数
         * @param {*} err 
         */
        function next(err) {
            if (i < 0) return
            if (err) {
                const errTask = tasks[tasks.length - 1].task
                errTask(err, req, res, next)
            } else {
                const task = tasks[i++]
                if (!task) return
                try {
                    const url = req.url
                    if (task.url) {
                        task.url === url ? task.task(req, res, next) : next()
                    } else {
                        task.task(req, res, next)
                    }
                } catch(err) {
                    next(err)
                }
            }
        }

        // 监听本次请求是否结束，结束则后续的中间件停止执行
        res.on('finish', () => {
            console.log('本次处理已经完成！')
            i = -1 // 退出中间件的后续处理
        })

        next()

    }

    /**
     * 注册中间件的函数
     */
    ex.use = function(...params) {
        if (typeof params[0] === 'string') {
            for (let i = 1; i <= params.length - 1; i++) {
                const task = {
                    url: params[0],
                    task: params[i]
                }
                tasks.push(task)
            }
        }
        if (typeof params[0] === 'function') {
            for (let i = 0; i <= params.length - 1; i++) {
                const task = {
                    task: params[i]
                }
                tasks.push(task)
            }
        }
    }
    
    return ex
}

module.exports = express